package com.classtype.rtti.demo3;

import java.lang.reflect.Method;

public class InnerImplementation {

	public static void main(String[] args) throws Exception {
		A3 a = InnerA.makeA();
		a.f();
		System.out.println(a.getClass().getName());
		
		callHiddenMethod(a, "f");
		callHiddenMethod(a, "v");
		callHiddenMethod(a, "w");
	}
	
	static void callHiddenMethod(Object a, String methodName) throws Exception {
		// getMethod 方法获得的是所有 public 访问级别的方法，包括从父类继承的方法，而 getDeclaredMethod
		// 获得的是自身类的所有方法，包括公有（public）方法，私有（private）方法等，而且不受限于访问权限，但是限定本类（可以访问本身类的方法或者内部类的方法）。
		Method m = a.getClass().getDeclaredMethod(methodName);
		m.setAccessible(true);
		m.invoke(a);
	}

}
